﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AdmLaboratorios;
using AdmLaboratorios.DTO;
using AdmLaboratorios.Business;

namespace AdmLaboratorios
{
    public partial class frmPermisos : Form
    {
        public NetBarControl.NetBarControl BarraLateral { get; set; }
        public MenuStrip MenuMDI { get; set; }

        public frmPermisos()
        {
            InitializeComponent();
        }

        private void cmbPerfil_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                LeerPermisosFuncionales();

                ConstruirArbol();

                LeerSeguridad();

                treeView1.ExpandAll();
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private void ConstruirArbol()
        {
            try
            {
                treeView1.Nodes.Clear();
                treeView1.Nodes.Add("ROOT", "Permisos", 0);

                //MenuMDI = FormsFactory.MDI.MenuPrincipal;
                BarraLateral = (FormsFactory.MDI).barControl;

                foreach (NetBarControl.NetBarGroup grupo in BarraLateral.Groups)
                {
                    CrearNodos(grupo, treeView1.Nodes["ROOT"]);
                }

                //foreach (ToolStripMenuItem i in MenuMDI.Items)
                //{
                //    CrearNodos(i, treeView1.Nodes["ROOT"]);
                //}
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private void CrearNodos(NetBarControl.NetBarGroup grupo, TreeNode padre)
        {
            if (grupo.Name != "")
            {
                TreeNode n = padre.Nodes.Add(grupo.Name, grupo.Text.Replace("&", ""), 2);

                if (!(grupo.Items == null || grupo.Items.Count == 0))
                {
                    foreach (NetBarControl.NetBarItem item in grupo.Items.OfType<NetBarControl.NetBarItem>())
                    {
                        if (item.Name != "")
                        {
                            n.Nodes.Add(item.Name, item.Text.Replace("&", ""), 2);
                        }
                    }
                }
            }
        }

        private void CrearNodos(ToolStripMenuItem i, TreeNode padre)
        {
            if (i.Name != "")
            {
                TreeNode n = padre.Nodes.Add(i.Name, i.Text.Replace("&", ""));

                if (!(i.DropDownItems == null || i.DropDownItems.Count == 0))
                {
                    foreach (ToolStripMenuItem ii in i.DropDownItems.OfType<ToolStripMenuItem>())
                    {
                        CrearNodos(ii, n);
                    }
                }
            }
        }

        private void PintarNodos(TreeNode tr)
        {
            tr.ForeColor = Color.SteelBlue;

            foreach (TreeNode t in tr.Nodes)
            {
                PintarNodos(t);
            }
        }

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Checked)
            {
                //Si selecciono un nodo, debo seleccionar todos sus padres.
                //SeleccionarPadre(e.Node);
                e.Node.ImageIndex = 1;
                if (e.Node.Parent != null)
                {
                    e.Node.Parent.Checked = true;
                    e.Node.Parent.ImageIndex = 1;
                }
            }
            else
            {
                e.Node.ImageIndex = 2;
                foreach (TreeNode n in e.Node.Nodes)
                {
                    n.Checked = false;
                    n.ImageIndex = 2;
                }
            }
            treeView1.Nodes["ROOT"].ImageIndex = 0;
        }

        private void MarcarNodo(TreeNode n, ref List<PermisoDTO> permisos)
        {
            foreach (PermisoDTO p in permisos)
            {
                if (p.NombreMenu == n.Name)
                {
                    n.Checked = true;
                    n.ImageIndex = 1;

                    foreach (TreeNode n2 in n.Nodes)
                    {
                        MarcarNodo(n2, ref permisos);
                    }
                    break;
                }
            }
        }

        private void LeerSeguridad()
        {
            List<PermisoDTO> permisos = Seguridad.PermisosByPerfil(((int)cmbPerfil.SelectedValue));

            foreach (TreeNode n in treeView1.Nodes)
            {
                MarcarNodo(n, ref permisos);
            }
        }

        private void frmSeguridad_Load(object sender, EventArgs e)
        {
            try
            {
                List<PerfilDTO> perfiles = Seguridad.Perfiles();
                cmbPerfil.ValueMember = "Id";
                cmbPerfil.DisplayMember = "Nombre";
                cmbPerfil.DataSource = perfiles;
                //FormsHelper.CargarCombo(ref cmbPerfil, Seguridad.CargarCombo(false));
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                //Primero limpio todos los permisos del perfil.
                Seguridad.LimpiarPermisosByPerfil((int)cmbPerfil.SelectedValue);

                //Ahora uso una funcion recursiva para guardar cada permiso tildado.
                GuardarSeguridad(treeView1.Nodes["ROOT"]);

                //Guardo los permisos por funcionalidad.
                GuardarPermisosFuncionales();

                ////Vuelvo a inicializar la seguridad del MDI.
                //((frmMDI)this.ParentForm).InicializarMenues();

                //Muestro mensaje de operacion completada.
                MessageBox.Show("Los permisos fueron actualizados correctamente.", "Operación Completada", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private void LeerPermisosFuncionales()
        {
            List<PermisoDTO> permisos = Seguridad.PermisosByPerfil(((int)cmbPerfil.SelectedValue));

            chkPuedeCrearAñoLectivo.Checked = TienePermiso(chkPuedeCrearAñoLectivo.Name, permisos);
            chkPuedeConfirmarAñoLectivo.Checked = TienePermiso(chkPuedeConfirmarAñoLectivo.Name, permisos);
            chkPuedeCambiarAlumnoCursada.Checked = TienePermiso(chkPuedeCambiarAlumnoCursada.Name, permisos);
            chkPuedeConfirmarAlumnoCursada.Checked = TienePermiso(chkPuedeConfirmarAlumnoCursada.Name, permisos);
            chkPuedeCambiarDocenteCursada.Checked = TienePermiso(chkPuedeCambiarDocenteCursada.Name, permisos);
            chkPuedeConfirmarDocenteCursada.Checked = TienePermiso(chkPuedeConfirmarDocenteCursada.Name, permisos);
            chkPuedeControlarNotas.Checked = TienePermiso(chkPuedeControlarNotas.Name, permisos);
            chkPuedeAprobarNotas.Checked = TienePermiso(chkPuedeAprobarNotas.Name, permisos);
        }

        private bool TienePermiso(string permisoBuscado, List<PermisoDTO> permisos)
        {
            foreach (PermisoDTO item in permisos)
                if (item.NombreMenu.ToLower().Trim() == permisoBuscado.ToLower().Trim())
                    return true;
            return false;
        }

        private void GuardarPermisosFuncionales()
        {
            GuardarPermisoFuncional(chkPuedeCrearAñoLectivo);
            GuardarPermisoFuncional(chkPuedeConfirmarAñoLectivo);
            GuardarPermisoFuncional(chkPuedeCambiarAlumnoCursada);
            GuardarPermisoFuncional(chkPuedeConfirmarAlumnoCursada);
            GuardarPermisoFuncional(chkPuedeCambiarDocenteCursada);
            GuardarPermisoFuncional(chkPuedeConfirmarDocenteCursada);
            GuardarPermisoFuncional(chkPuedeControlarNotas);
            GuardarPermisoFuncional(chkPuedeAprobarNotas);
        }

        private void GuardarPermisoFuncional(CheckBox chk)
        {
            if (chk.Checked)
                Seguridad.CrearPermiso(
                    (int)cmbPerfil.SelectedValue,
                    chk.Name);
        }

        private void GuardarSeguridad(TreeNode padre)
        {
            try
            {
                if (padre.Checked && padre.Name != "")
                {
                    //Persisto.
                    Seguridad.CrearPermiso(
                        (int)cmbPerfil.SelectedValue,
                        padre.Name);
                }

                foreach (TreeNode n in padre.Nodes)
                {
                    //Recursividad.
                    GuardarSeguridad(n);
                }
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
